package com.sunxiansheng.user.init;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * Description: 服务预热（服务启动的监听器）
 * @Author sun
 * @Create 2024/7/24 12:42
 * @Version 1.0
 */
@Component
@Slf4j
public class ApplicationInit implements ApplicationListener<ApplicationReadyEvent> {

    /**
     * key是描述，value是无参无返回的函数式接口，用于接受具体的预热逻辑
     */
    Map<String, InitFunction> initFunctionMap = new HashMap<>();

    {
        // 将具体的预热的对象逻辑放到map中
        initFunctionMap.put("预热JSON", this::initFastJson);
        // 其他的预热逻辑
    }

    @Override
    public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
        log.info("监听到服务启动，开始服务预热！");
        // 遍历
        initFunctionMap.forEach(
                (desc, function) -> {
                    try {
                        // 调用函数式接口的方法，执行具体的预热逻辑
                        function.invoke();
                    } catch (Exception e) {
                        log.error("ApplicationInit：{}.error", desc, e);
                    }
                }
        );
    }


    // ============================== 预热逻辑 ==============================
    /**
     * 预热JSON实例
     */
    private void initFastJson() {
        log.info("JSON预热完成！");
    }
    // ============================== 预热逻辑 ==============================

    /**
     * 无参，无返回值的函数式接口
     */
    @FunctionalInterface
    interface InitFunction {
        void invoke();
    }

}